Terraform Cloudで別のWorkspaceのStateファイルの値を参照する
「Terraform Cloudで別のWorkspaceのStateファイルを参照するには、どうしたらいいんだろう?」
Terraformを書いていると、別のStateファイルの情報を参照したくなることがあります。
Terraform Cloudの場合、どんな操作が必要かをブログにしてみました。
結論
- 参照される側
- Workspaceの
Remote state sharing
の設定で参照側のWorkspaceを許可 - 参照される値を
output
で定義
- Workspaceの
- 参照する側
data.terraform_remote_state
で該当の値を取得
例えば、VPC IDを他のWorkspaceで参照する場合は以下のようになります。
resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" tags = { Name = "main" } } output "vpc_id" { value = aws_vpc.main.id }
# OrganizationやWorkspaceを指定してdataで取得 data "terraform_remote_state" "vpc" { backend = "remote" config = { organization = "<Organization名>" workspaces = { name = "<参照側のWorkspace名>" } } } resource "aws_security_group" "test" { name = "test" description = "test" # VPC IDを取得 vpc_id = data.terraform_remote_state.vpc.outputs.vpc_id }
補足
参照する側Workspaceの実行モードがLocal
の場合、参照される側の以下の作業は不要です。
WorkspaceのRemote state sharingの設定で参照側のWorkspaceを許可
現時点(2023/05/14)では、実行モードLocal
参照される側のRemote state sharing
で参照側を許可していなくても、参照が可能でした。
やってみる
以下の2つのWorkspace/Stateファイルがあると仮定します。
- VPC(参照される側)
- セキュリティグループ(参照する側)
セキュリティグループ WorkspaceでVPC WorkspaceのからVPC IDを参照して、セキュリティグループを作成します。
サンプルコードはGithubにあります。
実際に試す場合は、backend.tf.sample
の値を適切な値に修正して、backend.tf
にファイル名を変更してください。
terraform-sample/tfstate-ref-tfc at main · msato0731/terraform-sample
Terraformコードの用意
以下のディレクトリ構成になっています。
VPCとSecurity GroupでStateファイルを分けている構成です。
$ tree . ├── security-group │ ├── backend.tf │ └── main.tf └── vpc ├── backend.tf └── main.tf
必要な部分だけ抜粋して、紹介します。
参照される側のVPCのコードでは、VPC IDをOutputとして定義しています。
# 省略 resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" tags = { Name = "main" } } output "vpc_id" { value = aws_vpc.main.id }
参照する側のSecurityGroupのコードでは、dataでWorkspaceのOutputを取得して、VPC IDをセットしています。
# VPC WorkspaceのState取得 data "terraform_remote_state" "vpc" { backend = "remote" config = { organization = "<Organization名>" # 要修正 workspaces = { name = "tfstate-ref-tfc-test-vpc" } } } resource "aws_security_group" "test" { name = "test" description = "test" # VPC ID取得 vpc_id = data.terraform_remote_state.vpc.outputs.vpc_id }
コードの用意ができたら、terraform init
を実行してWorkspaceを作成します。
作成したWorkspaceでTerraform CloudでAWSリソースを作成できるように、AWS認証情報の設定を行なってください。
この時点でVPCの方は、terraform plan/apply
に成功します。
しかし、Security Groupの方はVPC WorkspaceのState Fileを参照できず失敗します。
次の手順でSecurity Group Workspaceを許可してください。
VPC Workspace(参照される側)でSecurity Group Workspace(参照する側)を許可
VPC Workspace -> General -> Remote State Sharingを選択して、Security Group WorkspaceをShare先に指定するか組織全体にShareするかを行います。
手順を実施後は、Security Group Workspaceの方でもterraform plan/apply`に成功します。
おわりに
Terraform Cloudで別WorkspaceのStateファイルを参照する手順についてでした。
参照される側のWorkspaceで、他のWorkspaceから参照を許可するかどうかを設定できるのは便利かと思いました。
このWorkspaceのStateファイルはどこのWorkspaceから参照されているかを把握しやすそうです。
以上、AWS事業本部の佐藤(@chari7311)でした。